﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace WebTranslator {
	class CTSProtocolS : ServerProtocol {
		public TranslationServer masterServer;
		public CTSProtocolS(TranslationServer masterServer) {
			this.masterServer = masterServer;
		}
		private static int nextPort = StartingApplicationPorts.ClientPortsFrom;
		private static TcpListener NextListener {
			get {
				TcpListener tcpListener = new TcpListener(StartingApplicationPorts.ChosenAddress, nextPort);
				try {
					tcpListener.Start();
				} catch (SocketException) {
					nextPort++;
					if (nextPort > StartingApplicationPorts.ClientPortsTo)
						nextPort = StartingApplicationPorts.ClientPortsFrom;
					return NextListener;
				}
				nextPort++;
				return tcpListener;
			}
		}

		public override void Listen() {
			string[] napisy;
			while (true) {
				AcceptSocket();
				napisy = Receive().Split(' ');
				if (napisy[0] == "czesc") {
					TcpListener listener = NextListener;
					var conn = new ClientTSConnection(listener, masterServer, napisy[1]);
					masterServer.connections.Remove(napisy[1]);
					masterServer.connections.Add(napisy[1], conn);
					new Thread(conn.Run).Start();
					Send("czesc " + (listener.LocalEndpoint as IPEndPoint).Port);
				} else {
					Send("Unrecognized command.");
				}
			}
		}
	}
	public class ClientTSConnection : ServerProtocol {
		TranslationServer masterServer;
		string login;
		internal ClientTSConnection(TcpListener listener, TranslationServer masterServer, string login) {
			tcpListener = listener;
			this.masterServer = masterServer;
			this.login = login;
		}
		internal void Run() {
			AcceptSocket();
			if (Receive() == "OK") {
				Send("OK");
			//	try {
					Listen();
		//		} catch (Exception ex) {
		//			Console.WriteLine("Error. Connection closed.");
		//		}
			}
			return;
		}
		//funkcja do obsługi połączenia Serwera językowego z klientem
		public override void Listen() {
			TranslateBase.start();
			string msg;
			string MozliweKomunikaty = "ilemampkt" + " " + "listatematow" + " " + "tlumaczeniedodaj" + " " + "zrobilem" + " " + "pokaz" + " " + "mojeteksty" + " " + "szczegoly" + " " + "help" + " " + "quit";
			while (true) {
				msg = Receive();
				string[] napisy = msg.Split(' ');
				switch (napisy[0]) {
					case "ilemampkt":
						login = napisy[1];
						masterServer.Send(msg);
                        
						break;
					case "listatematow":
						ListaTematow();
						break;
					case "tlumaczeniedodaj":
						Dodawanie();
						break;
					case "pokaz":
						Zadanie z = TranslateBase.DajMiTlumaczenie(login, napisy[1]);
					
						Send(z.id + " " + z.tekst);
						break;

					case "zrobilem":
						napisy = msg.Split(new char[] { ' ' }, 3);
						TranslateBase.Translacja(login, napisy[2], napisy[1]);
                        masterServer.Send("dodajpkt " + login + " 1" );
                        
						break;
					case "mojeteksty":
						MojeTeksty();
						break;
					case "szczegoly":
						Szczegoly(msg.Split(new char[] { ' ' }, 2)[1]);

						break;
					case "quit":
						Send("Connection closed");
						masterServer.Send("users " + masterServer.activeUsers);
						Disconnect();
						return;
					case "help":
						Send(MozliweKomunikaty);
						break;
					default:
						Send(MozliweKomunikaty);
						break;
				}
			}
		}
		public void ListaTematow() {
			List<string> L = new List<string>();
			L = TranslateBase.CoMogeTlumaczyc(login);
			Send(L.Count.ToString());
			foreach (string s in L) Send(s);
		}

		public void MojeTeksty() {
			List<string> S = TranslateBase.MojeTeksty(login);
			Send(S.Count.ToString());
			foreach (string s in S) Send(s);
		}

		public void Dodawanie() {
			string msg;
			Tekst t;
			string nazwa = "", tresc = "", jezykwejscia = "", jezykwyjscia = "", separator = "";
			while (true) {
				msg = Receive();
				string[] napisy = msg.Split(new char[] { ' ' }, 2);
				switch (napisy[0]) {
					case "tresc": tresc = napisy[1]; break;
					case "nazwa": nazwa = napisy[1]; break;
					case "jezykwejscia": jezykwejscia = napisy[1]; break;
					case "jezykwyjscia": jezykwyjscia = napisy[1]; break;
					case "separator": separator = napisy[1]; break;
					case "tlok":
						t = new Tekst(nazwa, login, tresc, separator, jezykwejscia, jezykwyjscia);
						TranslateBase.DodajTekst(t);
						return;
				}
			}
		}

		public void Szczegoly(string nazwa) {
			List<string> s = TranslateBase.szczegoly(login, nazwa);
			if (s == null) { Send(""); Send(""); } else { Send(s[0]); Send(s[1]); }
		}
	}
}
